/** 
 * (#)IbatisEntityDao.java 1.0 2008-6-7 上午09:24:32 
 * 
 */
package com.hzh.blog.common.dao;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.hzh.blog.common.pager.Page;
import com.hzh.blog.common.pager.PropertyFilter;

public class IbatisEntityDao<T> extends IbatisGenericDao implements
		EntityDao<T> {

	/**
	 * DAO所管理的Entity类型.
	 */
	protected Class<T> entityClass;

	protected String primaryKeyName;

	/**
	 * 在构造函数中将泛型T.class赋给entityClass.
	 */
	@SuppressWarnings("unchecked")
	public IbatisEntityDao() {
		entityClass = GenericsUtils.getSuperClassGenricType(getClass());
	}

	/**
	 * 根据ID获取对象.
	 */
	public T findByPrimarykey(Serializable id) {
		return get(getEntityClass(), id);
	}

	/**
	 * 取得entityClass.
	 * <p/>
	 * JDK1.4不支持泛型的子类可以抛开Class<T> entityClass,重载此函数达到相同效果。
	 */
	protected Class<T> getEntityClass() {
		return entityClass;
	}

	public String getIdName(Class clazz) {
		return "id";
	}

	/**
	 * 分页查询.
	 */
	public Page pagedQuery(Map parameterObject, int start, int limit) {
		return pagedQuery(getEntityClass(), parameterObject, start, limit);
	}

	/**
	 * 分页查询.
	 */
	public Page pagedQuery(Map parameterObject, int start, int limit,
			String countSqlId, String pageQuerySqlId) {
		if (StringUtils.isNotBlank(pageQuerySqlId))
			return pagedQuery(getEntityClass(), parameterObject, start, limit,
					countSqlId, pageQuerySqlId);
		else {
			return pagedQuery(getEntityClass(), parameterObject, start, limit);
		}
	}

	/**
	 * 根据ID移除对象.
	 */
	public void deleteByPrimarykey(Serializable id) {
		System.out.println("id:" + id);
		removeById(getEntityClass(), id);
	}

	/**
	 * 保存对象. 为了实现IEntityDao 我在内部使用了insert和upate 2个方法.
	 */
	public void insert(T o) {
		super._insert(o);
	}

	public void setPrimaryKeyName(String primaryKeyName) {
		this.primaryKeyName = primaryKeyName;
	}

	public List<T> queryForList(String statementId, Object parameters) {
		return super.queryForList(getEntityClass(), statementId, parameters);

	}

	public T queryForObject(String statementId, Object parameters) {
		return super.queryForObject(getEntityClass(), statementId, parameters);
	}

	public void update(String statementId, Object parameters) {
		super.update(getEntityClass(), statementId, parameters);

	}

	public void update(T o) {
		super._update(o);
	}
	
	public List<T> queryAllList() {
		List<T> list = queryAllList(getEntityClass());
		return list;
	}

	public List<T> queryAll() {
		return queryAllList(getEntityClass());
	}
	/**
	 * 根据动态条件获得分页数据（使用默认的count 以及 query statement id）
	 * @param propertyFilters
	 * @param page
	 * @return
	 */
	public Page<T> findPagerObjectListByFilter(
			List<PropertyFilter> propertyFilters, Page<T> page, Map<String, String> otherMap) {
		return findPagerObjectListByFilter(getEntityClass(), propertyFilters, page, otherMap);
	}
	/**
	 * 根据动态条件获得分页数据（使用添加后缀的count以及query statement id）
	 * @param propertyFilters
	 * @param page
	 * @param suffix statement id 后缀
	 * @param otherParam
	 * @return
	 */
	public Page<T> findPagerObjectListByFilter(
			List<PropertyFilter> propertyFilters, Page<T> page, String suffix, Map<String, String> otherParam) {
		return findPagerObjectListByFilter(getEntityClass(), propertyFilters, page, suffix,otherParam);
	}
	/**
	 * 根据动态条件获得分页数据
	 * @param propertyFilters
	 * @param page
	 * @return
	 */
	public Page<T> findPagerObjectListByFilter(
			List<PropertyFilter> propertyFilters, Page<T> page) {
		return findPagerObjectListByFilter(getEntityClass(), propertyFilters, page);
	}
}